package com.cskaoyan.javase.oop1._12static._0introduction._0old;

/**
 * static关键字的引入
 * 引例：
 * 创建一个学生类，用来描述我们班全体同学，要求：
 * 		属性：姓名，性别，年龄，学号，学校信息
 * 		行为：吃饭，学习
 *
 * 创建多个Student对象，他们的属性取值可以不同，会发现什么问题呢？
 *
 * 显然，我们会发现以下问题：
 * 无论创建多少Student对象，由于该类描述的是我们班全体同学，他们的班级信息实际上是一样的
 * 创建多次对象，需要重复的给一个属性赋相同的值，这是很麻烦的，不方便的。
 * 这时,可以想着把它写死
 * 但是这种做法"治标不治本",不解决根本问题
 *
 * 学校信息这个属性实质上应该是被全体同学所共有的属性，而不是独属于某个对象的。
 * 所以，按照我们以往定义成员变量的方法来定义"学校信息"这个属性，是不合适的！
 * 所以就需要一种被全体对象所共享的属性,不再是属于对象的,而是属于全体对象的,属于类的一种变量来存"学校信息"
 *
 * 既然不合适，那么就需要改进，考虑以下改进方式：
 * 可以把成员变量"学校信息"，直接显式赋值为"王道训练营"或者直接写死构造方法赋值。
 * 这样确实可以实现功能，我们无需在每次创建对象时，再频繁给"学校信息"这个属性赋值了。
 * 但是没有从根本上解决问题，上述问题3依然存在：
 * 学校信息这个属性在每一个对象当中都存在，有点浪费内存空间。
 * 我们在设计类的时候其实已经知道这个属性，是全体对象都有，不应该属于某个对象。
 * 我们希望这个属性不是属于某一个对象的，而是一种类的特征，是属于类的，属于全体对象所共享的。
 *
 * 所以说一千道一万，"学校信息"这个属性不应该定义为"成员变量"，而应该考虑定义一种"全新的，属于类的"变量。
 * 实际上，属于类的变量在Java当中是存在的，即使用static关键字修饰的，Java当中的静态成员变量。
 *
 * 静态成员变量：
 * 是一种被全体对象共享，属于类的变量，存储在一片能够被全体对象所共享的内存区域。
 * 而不像成员变量一样，存储在对象当中！！
 *
 * @since 09:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建王道Java42th的童鞋对象
        WangDaoStudent s1 = new WangDaoStudent("张三", "男", 18, 1, "王道训练营");
        WangDaoStudent s2 = new WangDaoStudent("李四", "女", 28, 2, "王道训练营");
    }
}

class WangDaoStudent {
    String name;
    /*
        性别这种具有二元性的属性,很多程序员喜欢使用
        布尔类型的isMale或者isFemale来表示性别
        实际开发中不建议使用这种写法
        建议使用String类型的一个gender,sex
     */
    String gender;
    int age;
    int stuId;
    String schoolName = "王道训练营";

    // 构造器

    public WangDaoStudent() {
    }

    public WangDaoStudent(String name, String gender, int age, int stuId, String schoolName) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.stuId = stuId;
        this.schoolName = schoolName;
    }

    public void eat() {
        System.out.println("十点开始就想,今天中午吃什么呢?");
    }

    public void study() {
        System.out.println("学习使我快乐!");
    }

}